home *** CD-ROM | disk | FTP | other *** search
- unit uScreenSaver;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
- uGlobals, ExtCtrls;
-
- type
- TfrmScrn = class(TForm)
- Image1: TImage;
- procedure FormKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- procedure FormCreate(Sender: TObject);
- procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
- Y: Integer);
- procedure FormActivate(Sender: TObject);
- procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- procedure FormClose(Sender: TObject; var Action: TCloseAction);
- procedure FormShow(Sender: TObject);
- procedure FormDestroy(Sender: TObject);
- private
- { Private declarations }
- ImageIndex : integer;
- Timer : TTimer;
- Mouse : TPoint;
- DoneOnce : boolean;
- sil : TSSFileImageLocations;
- procedure StartSaver(var WinMsg : TMessage); message WM_USER+1;
- procedure StopSaver(var WinMsg : TMessage); message WM_USER+2;
- procedure GetPassword;
- procedure Trigger(Sender : TObject; var Done : Boolean);
- procedure DoTimer(Sender : TObject);
- public
- { Public declarations }
- LoadingApp : Boolean;
- end;
-
- var
- frmScrn: TfrmScrn;
-
- implementation
-
- uses
- jpeg, Registry;
-
- const
- IgnoreCount : Integer = 0;
-
- {$R *.DFM}
-
- procedure CursorOff;
- begin
- ShowCursor(False);
- end;
-
- procedure CursorOn;
- begin
- ShowCursor(True);
- end;
-
- procedure TfrmScrn.StartSaver(var WinMsg : TMessage);
- begin
- if DoneOnce then exit;
- DoneOnce := True;
- DoTimer(nil);
- end;
-
- procedure TfrmScrn.StopSaver(var WinMsg : TMessage);
- begin
- Timer.Enabled := False;
- GetPassword;
- end;
-
- procedure TfrmScrn.GetPassword;
- var
- MyMod : THandle;
- PwdFunc : function (Parent : THandle) : Boolean; stdcall;
- SysDir : String;
- NewLen : Integer;
- MyReg : TRegistry;
- OkToClose : Boolean;
- begin
- if (SSMode <> ssRun) then begin
- Close;
- Exit;
- end;
-
- IgnoreCount := 5;
- OkToClose := False;
- MyReg := TRegistry.Create;
- try
- MyReg.RootKey := HKEY_CURRENT_USER;
- if MyReg.OpenKey('Control Panel\Desktop',False) then begin
- try
- try
- ShowCursor(True);
- if MyReg.ReadInteger('ScreenSaveUsePassword') <> 0 then begin
- SetLength(SysDir,MAX_PATH);
- NewLen := GetSystemDirectory(PChar(SysDir),MAX_PATH);
- SetLength(SysDir,NewLen);
- if (Length(SysDir) > 0) and (SysDir[Length(SysDir)] <> '\') then
- SysDir := SysDir+'\';
- MyMod := LoadLibrary(PChar(SysDir+'PASSWORD.CPL'));
- if MyMod = 0 then
- OkToClose := True
- else begin
- PwdFunc := GetProcAddress(MyMod,'VerifyScreenSavePwd');
- if PwdFunc(Handle) then
- OkToClose := True;
- FreeLibrary(MyMod);
- end;
- end
- else
- OkToClose := True;
- finally
- ShowCursor(False);
- end;
- except
- OkToClose := True;
- end;
- end
- else
- OkToClose := True;
- finally
- MyReg.Free;
- end;
-
- if OkToClose then
- Close;
- end;
-
- procedure TfrmScrn.Trigger(Sender : TObject; var Done : Boolean);
- begin
- PostMessage(Handle,WM_USER+1,0,0);
- end;
-
- procedure TfrmScrn.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
- begin
- GetPassword;
- end;
-
- procedure TfrmScrn.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
- begin
- if IgnoreCount > 0 then begin
- Dec(IgnoreCount);
- Exit;
- end;
-
- if (Mouse.X = -1) and (Mouse.Y = -1) then begin
- Mouse.X := X;
- Mouse.Y := Y;
- end
- else
- if (Abs(X-Mouse.X) > 2) and (Abs(Y-Mouse.Y) > 2) then begin
- Mouse.X := X;
- Mouse.Y := Y;
- GetPassword;
- end;
- end;
-
- procedure TfrmScrn.FormCreate(Sender: TObject);
- begin
- LoadingApp := True;
- Timer := TTimer.Create(Self);
- Timer.Enabled := False;
- ImageIndex := 0;
- ReadINIFile;
- Timer.Interval := interval;
- ImageIndex := 0;
- Timer.OnTimer := DoTimer;
- sil := TSSFileImageLocations.Create(nil);
- end;
-
- procedure TfrmScrn.FormActivate(Sender: TObject);
- var
- Dummy : Boolean;
- fs : TFileStream;
- iListLoc, iMax, iSize, i, j : integer;
- Buf : array[0..19] of Char;
- begin
- if LoadingApp then
- begin
- fs := TFileStream.Create( Application.ExeName, fmOpenRead or fmShareDenyWrite );
- try
- fs.Position := fs.Size-40;
- j := fs.Read(Buf,20);
- if j <> 20 then exit;
- iSize := StrToIntDef(Trim(buf),0);
-
- j := fs.Read(Buf,20);
- if j <> 20 then exit;
- iListLoc := StrToIntDef(Trim(buf),0);
-
- fs.Position := iListLoc;
- try
- sil := TSSFileImageLocations(fs.ReadComponent(sil));
- except
- Application.Terminate;
- end;
- iMax := sil.Count;
-
- fs.Position := fs.Size-iSize-40;
- finally
- fs.free;
- end;
- LoadingApp := False;
- frmScrn.Color := clBlack;
- frmScrn.Top := 0;
- frmScrn.Left := 0;
- frmScrn.Width := Screen.Width;
- frmScrn.Height := Screen.Height;
- Mouse.X := -1;
- Mouse.Y := -1;
- Application.OnIdle := Trigger;
- SetWindowPos(Handle,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE + SWP_NOMOVE);
- SystemParametersInfo(SPI_SCREENSAVERRUNNING,1,@Dummy,0);
- CursorOff;
-
- frmScrn.Visible := True;
- end;
- end;
-
- procedure TfrmScrn.FormMouseDown(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- begin
- GetPassword;
- end;
-
- procedure TfrmScrn.FormClose(Sender: TObject; var Action: TCloseAction);
- var
- Dummy : Boolean;
- begin
- SystemParametersInfo(SPI_SCREENSAVERRUNNING,0,@Dummy,0);
- Application.OnIdle := nil;
- ReleaseCapture;
- CursorOn;
- end;
-
- procedure TfrmScrn.FormShow(Sender: TObject);
- begin
- ShowWindow(Application.Handle, sw_hide);
- Image1.Visible := True;
- end;
-
- procedure TfrmScrn.FormDestroy(Sender: TObject);
- begin
- sil.Free;
- end;
-
- procedure TfrmScrn.DoTimer(Sender: TObject);
- var
- fs : TFileStream;
- ssi : TSSImage;
- begin
- Timer.Enabled := False;
- Application.ProcessMessages;
-
- if sil.Count = 0 then exit;
- if ImageIndex > sil.Count-1 then
- ImageIndex := 0;
-
- Application.ProcessMessages;
- fs := TFileStream.Create( Application.ExeName, fmOpenRead or fmShareDenyWrite );
- try
- fs.Position := sil.Items[ImageIndex];
- ssi := TSSImage(fs.ReadComponent(nil));
- try
- TSSImage(ssi).Execute(Image1.Picture);
- finally
- ssi.Free;
- end;
- finally
- fs.free;
- end;
- Application.ProcessMessages;
- inc(ImageIndex);
- Timer.Enabled := True;
- end;
-
- end.
-
-